package com.wanglei.rdd.create

import org.apache.spark.{SparkConf, SparkContext}

object Spark04_rdd_file_partition {

  def main(args: Array[String]): Unit = {
    //
    val conf = new SparkConf().setMaster("local[1]").setAppName("rdd")
    val sc = new SparkContext(conf)

    // 默认分区 minPartitions : math.min(defaultParallelism, 2)
    // 文件分区计算方式
    // spark读取文件底层使用hadoop方式读取
    // FileInputFormat#getSplits()
    // totalSize 文件总共7字节
    // goalSize 7/2 = 3 字节 每个分区的字节数
    // 7 /3 = 2 .. 1 需要三个分区 【3，3，1】

    // 上面是计算分区的逻辑，但是每个分区的数据是不是按照字节[3,3,1]来分配呢，其实不是
    // 1 数据读取是一行一行读取的，不是按照字节数读取的，如果是按照字节数读取的话，做word-count就可能会把单词拆开对吧
    // 2 数据读取以偏移量为单位
    /*
    1@@   => 012
    2@@   => 345
    3     => 6
     */
     // 3 数据分区的偏移量范围的计算
     // [0,3] = 12 因为按照行读，所以读的是1@@和2@@
    //  [3,6] = 3  因为偏移量不会被重置，所以读的是3
    //  [6,7]      什么都没有


    // 注意：当数据源为多个文件时，会一个一个文件来进行上面的处理
    // 总结：1 一读读一行 2 读取按照偏移量


    val rdd = sc.textFile("datas/file.txt", 3)
    rdd.saveAsTextFile("output")


    //
    sc.stop()
  }
}
